package com.kmxd.ams.client.arrange;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.kmxd.ams.client.arrange.dto.*;
import com.kmxd.ams.client.arrange.vo.CheckEfileVO;
import com.kmxd.ams.client.arrange.vo.UploadImportDataVO;
import com.kmxd.ams.client.arrange.vo.UploadImportVO;
import com.kmxd.ams.infra.arrange.base.BaseBO;
import com.kmxd.ams.infra.arrange.entity.Document;
import java.util.List;
import java.util.Map;
import org.springframework.transaction.annotation.Transactional;

/**
 * 文件级 服务类
 *
 * @author ZuoLG
 * @since 2022-07-20
 */
public interface IDocumentSvc extends IService<Document> {

  /**
   * 分页查询
   *
   * @param reqPage
   * @param req
   * @return
   */
  Page<Document> selectPage(Page reqPage, Document req);

  /**
   * 查询列表
   *
   * @param req
   * @return
   */
  List<Document> selectList(Document req);

  /**
   * 查询导出数据
   *
   * @param req
   * @return
   */
  List<Map<String, Object>> selectExport(DataExportDTO req);

  /**
   * 查询当天的doc对象
   *
   * @param req
   * @return
   */
  List<Document> selectListByDay(DocumentDayQueryDTO req);

  /**
   * 根据ids列表查询对象
   *
   * @param req
   * @return
   */
  List<Document> selectListByIds(BaseBO req);

  /**
   * 根据盒id查询盒内文件
   *
   * @param req
   * @param have true获取存在文件，false取不存在文件
   * @return
   */
  List<Document> selectListByBoxIds(BaseBO req, boolean have);

  /**
   * 根据案卷id查询案卷内文件
   *
   * @param req
   * @param have true获取存在文件，false取不存在文件
   * @return
   */
  List<Document> selectListByVolIds(BaseBO req, boolean have);

  /**
   * 根据项目id查询项目下的文件
   *
   * @param req
   * @param have
   * @return
   */
  List<Document> selectListByProjIds(BaseBO req, boolean have);

  /**
   * 新增
   *
   * @param req
   */
  void add(Document req);

  void summary(Document req);

  /**
   * 修改
   *
   * @param req
   */
  void edit(Document req);

  /**
   * 删除
   *
   * @param req
   */
  void remove(Document req);

  /**
   * 查看
   *
   * @param req
   * @return
   */
  Document view(Document req);

  /**
   * 真删除单个
   *
   * @param req
   * @return
   */
  Document viewIgnoreDelFlag(Document req);

  /**
   * 校验文件是否同一分组
   *
   * @param req
   * @return
   */
  boolean verify(Document req);

  /**
   * 统计
   *
   * @param req
   * @return
   */
  long count(Document req);

  /**
   * 复制
   *
   * @param req
   */
  void copy(DocumentCopyDTO req);

  /**
   * 清空电子文件
   *
   * @param req
   * @return
   */
  boolean removeAllEfile(BaseBO req);

  /**
   * 检查电子文件
   *
   * @param req
   * @return
   */
  List<CheckEfileVO> checkEfile(BaseBO req);

  /**
   * 根据分组条件获取流水
   *
   * @param columnMap
   * @param tableId
   * @return
   */
  String getSequence(Map<String, Object> columnMap, String tableId);

  /**
   * 获取下一个文件序号
   * @param columnMap
   * @param tableId
   * @param onlyArchived
   * @return
   */
  Integer getMaxDocSequence(Map<String, Object> columnMap, String tableId, boolean onlyArchived);

  /**
   * 根据bo的ids清空相应的盒、案卷、项目关联关系
   *
   * @param req
   */
  @Transactional(rollbackFor = Exception.class)
  void detach(DetachDTO req);

  /**
   * 删除回收站
   *
   * @param req
   * @return
   */
  Boolean cleanTrash(BaseBO req);

  /**
   * 数据还原
   *
   * @param req
   * @return
   */
  Boolean recoveryData(BaseBO req);

  /**
   * 文件上传导入
   *
   * @param req
   * @return
   * @throws Exception
   */
  UploadImportVO importUpload(UploadImportFileDTO req) throws Exception;

  /**
   * 上传导入数据
   *
   * @param req
   * @return
   * @throws Exception
   */
  UploadImportDataVO importData(UploadImportDataDTO req) throws Exception;

  /**
   * 修改状态
   *
   * @param req
   */
  void changeStatus(Document req);

  /**
   * 统计项目下案卷内文件
   *
   * @param tableId
   * @return
   */
  List<Document> statisticProjByVol(String tableId);

  /**
   * 查询忽略全宗
   *
   * @param req
   * @return
   */
  List<Document> selectListIgnoreFonds(BaseBO req);
}
